package DAO;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
import model.Profesional;

public class ProfesionalDAO {
	private static EntityManagerFactory emf = Persistence
			.createEntityManagerFactory("baseHospital");

	public void guardar(Profesional p) {
		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		EntityTransaction etx = em.getTransaction();
		etx.begin();
		em.merge(p);
		em.flush();
		etx.commit();
		em.close();
	}

	public List<Profesional> listar(int from, int to, String criterio,
			String orden) {
		List<Profesional> resultado;

		String sord = "desc";
		if (orden != null && !orden.equals(""))
			sord = orden;

		// order by por defecto: nombre desc
		String stringOrderBy = "nombre " + sord;

		if (criterio != null && !criterio.equals(""))
			stringOrderBy = criterio + " " + sord + ", " + stringOrderBy;

		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		Query consulta;

		consulta = em.createQuery("select p from Profesional p order by "
				+ stringOrderBy);

		consulta.setFirstResult(from);
		consulta.setMaxResults(to - from);

		resultado = (List<Profesional>) consulta.getResultList();

		em.close();

		return resultado;
	}

	public Profesional getProfesional(int i) {
		Profesional resultado;

		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		Query consulta;
		consulta = em
				.createQuery("select p from Profesional p where p.id = :id");
		consulta.setParameter("id", i);
		resultado = (Profesional) consulta.getSingleResult();

		em.close();
		return resultado;
	}

	public int contar() {
		int resultado;
		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		Query consulta = em.createQuery("select p from Profesional p");
		resultado = consulta.getResultList().size();
		em.close();
		return resultado;
	}

	public boolean hayProfesionales() {
		return contar() > 0;
	}

	public List<Profesional> listar(int from, int to, String criterio,
			String orden, String searchField, String searchString,
			String searchOper) {
		List<Profesional> resultado;

		String sord = "desc";
		if (orden != null && !orden.equals(""))
			sord = orden;

		// order by por defecto: nombre desc
		String stringOrderBy = "nombre " + sord;

		if (criterio != null && !criterio.equals(""))
			stringOrderBy = criterio + " " + sord + ", " + stringOrderBy;

		if (searchOper.equals("lt"))
			searchOper = "<";
		else if (searchOper.equals("gt"))
			searchOper = ">";

		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		Query consulta;
		if (searchString.equals("")) // muestra todos los resultados
			consulta = em.createQuery("select p from Profesional p order by "
					+ stringOrderBy);
		else if (searchOper.equals("cn")) { // filtro tipo "contiene", sin
											// distinguir mayusculas
			consulta = em
					.createQuery("select p from Profesional p where LOWER(p."
							+ searchField + ") LIKE :busqueda order by "
							+ stringOrderBy);
			consulta.setParameter("busqueda",
					"%" + searchString + "%".toLowerCase());
		} else if (searchOper.equals("bw")) { // filtro tipo "comienza con", sin
												// distinguir mayusculas
			consulta = em
					.createQuery("select p from Profesional p where LOWER(p."
							+ searchField + ") LIKE :busqueda order by "
							+ stringOrderBy);
			consulta.setParameter("busqueda", searchString + "%".toLowerCase());
		} else
			consulta = em.createQuery("select p from Profesional p where p."
					+ searchField + " " + searchOper + " " + searchString
					+ " order by " + stringOrderBy);

		consulta.setFirstResult(from);
		consulta.setMaxResults(to - from);

		resultado = (List<Profesional>) consulta.getResultList();

		em.close();
		return resultado;
	}

	public void borrar(int id) {
		Profesional resultado;
		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		EntityTransaction etx = em.getTransaction();
		etx.begin();
		Query consulta;
		consulta = em
				.createQuery("select p from Profesional p where p.id = :id");
		consulta.setParameter("id", id);
		resultado = (Profesional) consulta.getSingleResult();
		em.remove(resultado);
		etx.commit();
		em.close();

	}

	public Collection<Profesional> getProfesionales() {
		Collection<Profesional> resultado;

		EntityManager em = ProfesionalDAO.emf.createEntityManager();
		Query consulta;
		consulta = em
				.createQuery("select p from Profesional p ");
		resultado = (Collection<Profesional>) consulta.getResultList();

		em.close();
		return resultado;
	}

}
